﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using Com.AlbLab.GEP.Domain;
using Com.AlbLab.GEP.Domain.Entities;
using Oracle.DataAccess.Client;
using log4net;
using System.Linq;


namespace Com.AlbLab.GEP.Dao.Impl
{
    public class DaoOracleDbHelper<T>
    {
        private static readonly ILog _log = LogManager.GetLogger("DaoOracleDbHelper");
        
        internal delegate T MapToObjectDel(IDataRecord dr);
        
        internal static ICollection<T> ExecSelectCommand(OracleCommand ocmd, MapToObjectDel func)
        {
            try
            {
                using (OracleDataReader ordr = ocmd.ExecuteReader())
                {
                    ICollection<T> result = new List<T>();
                    if (ordr.HasRows)
                    {
                        while (ordr.Read())
                        {
                            result.Add(func.Invoke(ordr));
                        }
                    }
                    return result;
                }
            }
            catch (OracleException ex)
            {
                //ManagedException mex = new ManagedException(ex.Message, "ORAUNI-003", "ExecSelectCommand", ex.Source, ex.InnerException);
                //ErrorLog errorlog = new ErrorLog(mex);
                //_log.Error(errorlog);
                throw;
            }
        }
    }

    public static class DaoOracleDbHelper
    {
        
        internal static UtenteEntity MapUtente(IDataRecord dr)
        {
            UtenteEntity ut = new UtenteEntity();
            ut.Id = dr.GetDecimal("ID");
            ut.Username = dr.GetString("USERNAME");
            ut.Password = dr.GetString("PASSWORD");
            ut.Nome = dr.GetString("NOME");
            ut.Cognome = dr.GetString("COGNOME");
            ut.IsAdmin = dr.GetBoolNumber("ISADMIN");
            ut.RoleC = dr.GetBoolNumber("ROLEC");
            ut.RoleV = dr.GetBoolNumber("ROLEV");
            return ut;
        }

        internal static GEP_ANA_UFFICI MapUffici(IDataRecord dr)
        {
            GEP_ANA_UFFICI uf = new GEP_ANA_UFFICI();
            uf.Id_cod_ufficio = dr.GetDecimal("UFF_CODICE").ToString();
            uf.Des_ufficio = dr.GetString("UFF_DESCRIZIONE");
            return uf;
        }

        internal static GEP_ANA_STATI_PRATICA MapStatiPratica(IDataRecord dr)
        {
            GEP_ANA_STATI_PRATICA sp = new GEP_ANA_STATI_PRATICA();
            sp.ID_stati_pratica = dr.GetDecimal("STP_CODICE").ToString();
            sp.DES_stato_pratica = dr.GetString("STP_DESCRIZIONE");
            return sp;
        }

        internal static GEP_ANA_FASE MapAnagraficaFase(IDataRecord dr)
        {
            GEP_ANA_FASE t = new GEP_ANA_FASE(dr.GetString("AFA_COD_SERVIZIO"), dr.GetDecimal("AFA_NRO_FASE"));
            t.Afa_des_fase = dr.GetString("AFA_DES_FASE");
            t.Afa_stampa = dr.GetString("AFA_STAMPA");
            return t;
        }

        internal static GEP_ANA_INAM MapAnagraficaInammissibilita(IDataRecord dr)
        {
            GEP_ANA_INAM t = new GEP_ANA_INAM();
            t.Id_ina_cod_inam = dr.GetString("INA_COD_INAM");
            t.Ina_des_inam = dr.GetString("INA_DES_INAM");
            return t;
        }

        internal static GEP_ANA_MOTSTAFASE MapMotivoStatoFase(IDataRecord dr)
        {
            GEP_ANA_MOTSTAFASE t = new GEP_ANA_MOTSTAFASE();
            t.Id_mfa_cod_motiv = dr.GetString("MFA_COD_MOTIV");
            t.Mfa_des_motiv = dr.GetString("MFA_DES_MOTIV");
            return t;
        }

        internal static GEP_ANA_SERV MapServizio(IDataRecord dr)
        {
            GEP_ANA_SERV t = new GEP_ANA_SERV();
            t.Id_ser_cod_servizio = dr.GetString("SER_COD_SERVIZIO");
            t.Ser_des_servizio = dr.GetString("SER_DES_SERVIZIO");
            if (dr.GetString("SER_COD_SERVIZIO") == " ")
            {
                t.Ser_des_servizio_ext = " ";
            }
            else
            {
                //t.Ser_des_servizio_ext = string.Concat(dr.GetString("SER_DES_SERVIZIO")," (",dr.GetString("SER_COD_SERVIZIO"),")");
                t.Ser_des_servizio_ext = string.Concat("(", dr.GetString("SER_COD_SERVIZIO"), ") ", dr.GetString("SER_DES_SERVIZIO"));
            }
            return t;
        }

        internal static GEP_ANA_VENDI MapVenditore(IDataRecord dr)
        {
            GEP_ANA_VENDI t = new GEP_ANA_VENDI();
            t.Id_ven_cod_contr_disp = dr.GetString("VEN_COD_CONTR_DISP");
            t.Ven_ragsoc= dr.GetString("VEN_RAGSOC");
            return t;
        }

        internal static GEP_ANA_STATOF MapStatoFase(IDataRecord dr)
        {
            GEP_ANA_STATOF t = new GEP_ANA_STATOF();
            t.Id_stf_cod_stato = dr.GetString("STF_COD_STATO");
            t.Stf_des_stato = dr.GetString("STF_DES_STATO");
            return t;
        }

        internal static GEP_TESTATA MapTestata(IDataRecord dr)
        {
             GEP_TESTATA t = new GEP_TESTATA(
                dr.GetDecimal("TES_COD_PRATICA"),
                dr.GetString("TES_COD_SERVIZIO"),
                dr.GetString("TES_COD_CONTR_DISP"));
             t.Tes_Stato = dr.GetDecimal("TES_STATO");
             t.Tes_Piva_Utente=dr.GetString("TES_PIVA_UTENTE");
             t.Tes_Piva_Distributore=dr.GetString("TES_PIVA_DISTRIBUTORE");
             t.Tes_Cod_Prat_Utente=dr.GetString("TES_COD_PRAT_UTENTE");
             t.Tes_Pod = dr.GetString("TES_POD"); 
             t.Tes_Codfis_Cli=dr.GetString("TES_CODFIS_CLI");
             t.Tes_Pariva_Cli=dr.GetString("TES_PARIVA_CLI");
             t.Tes_Cod_Pres=dr.GetString("TES_COD_PRES");
             t.Tes_Tel_Cli=dr.GetString("TES_TEL_CLI");
             t.Tes_Filename_Ric=dr.GetString("TES_FILENAME_RIC");
             t.Tes_Dt_Arr_Pra=dr.GetDateTime("TES_DT_ARR_PRA");
             t.Tes_Dt_Ins_Pra = dr.GetDateTime("TES_DT_INS_PRA");
             t.Tes_Des_Pra=dr.GetString("TES_DES_PRA");
             t.Tes_DBA_Ragsoc_Ute = dr.GetString("TES_RAGSOC_UTE");
             t.Tes_DBA_Ragsoc_Cli = dr.GetString("TES_RAGSOC_CLI");
             t.Tes_DBA_Ind_Cli = dr.GetString("TES_IND_CLI");
             t.Tes_DBA_Ind_Fornit = dr.GetString("TES_IND_FORNIT");
             t.Tes_DBA_Cod_Contr_Cli = dr.GetString("TES_COD_CONTR_CLI");
             t.Tes_DBA_Mis_Eleco = dr.GetString("TES_MIS_ELECO");
             t.Tes_DBA_Matr_Att = dr.GetString("TES_MATR_ATT");
             t.Tes_DBA_Matr_Rea = dr.GetString("TES_MATR_REA");
             t.Tes_DBA_Matr_Pot = dr.GetString("TES_MATR_POT");
             t.Tes_DBA_Tensione = dr.GetString("TES_TENSIONE");
             t.Tes_DBA_Potenza_Contr = dr.GetDecimal("TES_POTENZA_CONTR");
             t.Tes_DBA_Potenza_Toll = dr.GetDecimal("TES_POTENZA_TOLL");
             t.Tes_DBA_Uso = dr.GetString("TES_USO");
             t.Tes_DBA_K = dr.GetString("TES_K");
             t.Tes_Note=dr.GetString("TES_NOTE");
             t.Tes_Dt_Chi_Pra = dr.GetDateTime("TES_DT_CHI_PRA");
             t.Tes_Dt_Inv_Pra = dr.GetDateTime("TES_DT_INV_PRA");
             return t;
        }

        internal static GEP_TESTATA MapTestataList(IDataRecord dr)
        {
            GEP_TESTATA t = new GEP_TESTATA(
                dr.GetDecimal("TES_COD_PRATICA"),
                dr.GetString("TES_COD_SERVIZIO"),
                dr.GetString("TES_COD_CONTR_DISP"));
              
            t.Tes_Dt_Arr_Pra=dr.GetDateTime("TES_DT_ARR_PRA");
            t.Tes_Codfis_Cli=dr.GetString("TES_CODFIS_CLI");
            t.Tes_Pariva_Cli=dr.GetString("TES_PARIVA_CLI");
            t.Tes_DBA_Ragsoc_Cli = dr.GetString("TES_RAGSOC_CLI");
            t.Tes_Pod=dr.GetString("TES_POD");
            t.Tes_Cod_Prat_Utente = dr.GetString("TES_COD_PRAT_UTENTE");
            t.Tes_Stato = dr.GetDecimal("TES_STATO");
            t.Tes_ufficio_assegnazione = Convert.ToInt32( dr.GetString("FAS_UNIT_OPER"));
            t.Tes_ultima_fase = dr.GetString("FAS_DES_FASE");
            return t;
        }
        internal static GEP_DATI_NOSTD MapDatiNoStd(IDataRecord dr)
        {
            GEP_DATI_NOSTD t = new GEP_DATI_NOSTD(dr.GetDecimal("NST_COD_PRATICA"));

            t.Nst_Pot_Rich_Contr = dr.GetDecimal("NST_POT_RICH_CONTR");
            t.Nst_Pot_Rich_Toll = dr.GetDecimal("NST_POT_RICH_TOLL");
            t.Nst_Fasi_Rich = dr.GetDecimal("NST_FASI_RICH");
            t.Nst_Tens_Rich = dr.GetDecimal("NST_TENS_RICH");
            t.Nst_Uso_Rich = dr.GetString("NST_USO_RICH");
            t.Nst_Ragsoc_New = dr.GetString("NST_RAGSOC_NEW");
            t.Nst_Piva_New = dr.GetString("NST_PIVA_NEW");
            t.Nst_Codfis_New = dr.GetString("NST_CODFIS_NEW");
            t.Nst_Ind_Fornit_New = dr.GetString("NST_IND_FORNIT_NEW");
            t.Nst_Nro_Pra_Rif = dr.GetString("NST_NRO_PRA_RIF");
            return t;
        }

        internal static GEP_DATID01 MapDatiD01(IDataRecord dr)
        {
            GEP_DATID01 t = new GEP_DATID01(dr.GetDecimal("DD01_COD_PRATICA"));
            //t.Dd01_Cod_Servizio = dr.GetString("DD01_COD_SERVIZIO");
            t.Dd01_Disatt_Fuori_Orario = dr.GetString("DD01_DISATT_FUORI_ORARIO");
            t.Dd01_Dt_Non_Esegprima = dr.GetDateTime("DD01_DT_NON_ESEGPRIMA");
            t.Dd01_presenza_cliente_finale = dr.GetString("DD01_presenza_cliente_finale");
            return t;
            
        }

        internal static GEP_DATIM01 MapDatiM01(IDataRecord dr)
        {
            GEP_DATIM01 t = new GEP_DATIM01(dr.GetDecimal("DM01_COD_PRATICA"));
            //t.Dm01_Cod_Servizio = dr.GetString("DM01_COD_SERVIZIO");
            t.Dm01_Letrecl_Af1 = dr.GetDecimal("DM01_LETRECL_AF1");
            t.Dm01_Letrecl_Af2 = dr.GetDecimal("DM01_LETRECL_AF2");
            t.Dm01_Letrecl_Af3 = dr.GetDecimal("DM01_LETRECL_AF3");
            t.Dm01_Letrecl_Rf1 = dr.GetDecimal("DM01_LETRECL_RF1");
            t.Dm01_Letrecl_Rf2 = dr.GetDecimal("DM01_LETRECL_RF2");
            t.Dm01_Letrecl_Rf3 = dr.GetDecimal("DM01_LETRECL_RF3");
            t.Dm01_Letrecl_Pf1 = dr.GetDecimal("DM01_LETRECL_PF1");
            t.Dm01_Letrecl_Pf2 = dr.GetDecimal("DM01_LETRECL_PF2");
            t.Dm01_Letrecl_Pf3 = dr.GetDecimal("DM01_LETRECL_PF3");
            t.Dm01_Dt_Let_Recl = dr.GetDateTime("DM01_DT_LET_RECL");
            t.Dm01_Tip_Let_Recl = dr.GetString("DM01_TIP_LET_RECL");
            t.Dm01_New_Recl = dr.GetString("DM01_NEW_RECL");
            t.Dm01_Codreclamo = dr.GetString("DM01_CODRECLAMO");
            t.Dm01_Letcli_Af1 = dr.GetDecimal("DM01_LETCLI_AF1");
            t.Dm01_Letcli_Af2 = dr.GetDecimal("DM01_LETCLI_AF2");
            t.Dm01_Letcli_Af3 = dr.GetDecimal("DM01_LETCLI_AF3");
            t.Dm01_Letcli_Rf1 = dr.GetDecimal("DM01_LETCLI_RF1");
            t.Dm01_Letcli_Rf2 = dr.GetDecimal("DM01_LETCLI_RF2");
            t.Dm01_Letcli_Rf3 = dr.GetDecimal("DM01_LETCLI_RF3");
            t.Dm01_Letcli_Pf1 = dr.GetDecimal("DM01_LETCLI_PF1");
            t.Dm01_Letcli_Pf2 = dr.GetDecimal("DM01_LETCLI_PF2");
            t.Dm01_Letcli_Pf3 = dr.GetDecimal("DM01_LETCLI_PF3");
            t.Dm01_Dt_Let_Cli = dr.GetDateTime("DM01_DT_LET_CLI");
            return t;
        }

        internal static GEP_DATIM02 MapDatiM02(IDataRecord dr)
        {
            GEP_DATIM02 t = new GEP_DATIM02(dr.GetDecimal("DM02_COD_PRATICA"));
            //t.Dm02_Cod_Servizio = dr.GetString("DM02_COD_SERVIZIO");
            t.Dm02_Rag_Soc = dr.GetString("DM02_RAG_SOC");
            t.Dm02_Cognome = dr.GetString("DM02_COGNOME");
            t.Dm02_Nome = dr.GetString("DM02_NOME");
            t.Dm02_Toponimo = dr.GetString("DM02_TOPONIMO");
            t.Dm02_Via = dr.GetString("DM02_VIA");
            t.Dm02_Civ = dr.GetString("DM02_CIV");
            t.Dm02_Scala = dr.GetString("DM02_SCALA");
            t.Dm02_Piano = dr.GetString("DM02_PIANO");
            t.Dm02_Int = dr.GetString("DM02_INT");
            t.Dm02_Cap = dr.GetString("DM02_CAP");
            t.Dm02_Istat = dr.GetString("DM02_ISTAT");
            t.Dm02_Comune = dr.GetString("DM02_COMUNE");
            t.Dm02_Prov = dr.GetString("DM02_PROV");
            t.Dm02_Cod_Reclamo = dr.GetString("DM02_COD_RECLAMO");
            t.Dm02_Rif_Reclamo = dr.GetString("DM02_RIF_RECLAMO");
            t.Dm02_Codfis = dr.GetString("DM02_CODFIS");
            t.Dm02_Piva = dr.GetString("DM02_PIVA");
            t.Dm02_Dati_Tec_Ric = dr.GetString("DM02_DATI_TEC_RIC");
            t.Dm02_Rif_Quesiti = dr.GetString("DM02_RIF_QUESITI");
            return t;
        }

        internal static GEP_ESITO MapEsito(IDataRecord dr)
        {
            GEP_ESITO t = new GEP_ESITO(dr.GetDecimal("COD_FLUSSO"));//TODO: quale è i lcampo che lega esito a pratica???
            //t.Cod_Servizio = dr.GetString("COD_SERVIZIO");
            t.Piva_Utente = dr.GetString("PIVA_UTENTE");
            t.Piva_Distributore = dr.GetString("PIVA_DISTRIBUTORE");
            t.Cod_Prat_Utente = dr.GetString("COD_PRAT_UTENTE");
            t.Cod_Prat_Distrib = dr.GetString("COD_PRAT_DISTRIB");
            t.Verifica_Amm = dr.GetString("VERIFICA_AMM");
            t.Cod_Causale = dr.GetString("COD_CAUSALE");
            t.Motivazione = dr.GetString("MOTIVAZIONE");
            t.Stato_Spedizione = dr.GetString("STATO_SPEDIZIONE");
            t.Data_Spedizione = dr.GetDateTime("DATA_SPEDIZIONE");
            return t;
        }

        internal static GEP_FASE MapFase(IDataRecord dr)
        {
            GEP_FASE t = new GEP_FASE(dr.GetDecimal("FAS_ID"),
                                      dr.GetDecimal("FAS_COD_PRATICA"),
                                      dr.GetString("FAS_COD_SERVIZIO"),
                                      dr.GetDecimal("FAS_NRO_FASE"));
           
            t.Gep_ana_fase.Afa_des_fase = dr.GetString("FAS_DES_FASE");
            t.Fas_Progr_Fase = dr.GetDecimal("FAS_PROGR_FASE");
            t.Fas_Unit_Oper = dr.GetString("FAS_UNIT_OPER");
            t.Fas_Dt_Arrivo = dr.GetDateTime("FAS_DT_ARRIVO");
            t.Gep_ana_statof.Id_stf_cod_stato = dr.GetString("FAS_STATO");
            t.Gep_ana_motstafase.Id_mfa_cod_motiv = dr.GetString("FAS_MOTIVAZ_FASE");
            t.Gep_ana_motstafase_chiusura.Id_mfa_cod_motiv = dr.GetString("FAS_MOTIVAZ_CHIUSURA");
            t.Fas_Dt_Inilav = dr.GetNullableDateTime("FAS_DT_INILAV");
            t.Fas_Dtora_App_Proasm = dr.GetNullableDateTime("FAS_DTORA_APP_PROASM");
            t.Fas_Dtora_App_Procli = dr.GetNullableDateTime("FAS_DTORA_APP_PROCLI");
            t.Fas_Dtora_App = dr.GetNullableDateTime("FAS_DTORA_APP");
            t.Fas_Dt_Atto_Rich = dr.GetNullableDateTime("FAS_DT_ATTO_RICH");
            t.Fas_Dt_Atto_Ott = dr.GetNullableDateTime("FAS_DT_ATTO_OTT");
            t.Fas_Dt_Inisosp = dr.GetNullableDateTime("FAS_DT_INISOSP");
            t.Fas_Dt_Finesosp = dr.GetNullableDateTime("FAS_DT_FINESOSP");
            t.Fas_Dt_Finelav = dr.GetNullableDateTime("FAS_DT_FINELAV");
            t.Fas_Imp_Addeb = dr.GetDecimal("FAS_IMP_ADDEB");
            t.Fas_Note = dr.GetString("FAS_NOTE");
           
            t.Documento = new GEP_FASE.GEP_BLOB();
            t.Documento.Blb_intestazione_doc = dr.GetString("DOC_NAME");
            t.Documento.Blb_Id = dr.GetDecimal("DOC_ID");
            return t;
            
        }

        internal static GEP_FASE.GEP_BLOB MapDocumento(IDataRecord dr)
        {
            GEP_FASE.GEP_BLOB t = new GEP_FASE.GEP_BLOB();
            t.Blb_intestazione_doc = dr.GetString("BLB_INTESTAZIONE_DOC");
            t.Blb_Id = dr.GetDecimal("BLB_ID_FASE");
            t.Blb_doc = dr.GetBytes("BLB_DOC");
            return t;
        }

        internal static GEP_FASE MapFaseList(IDataRecord dr)
        {
            GEP_FASE t = new GEP_FASE(dr.GetDecimal("FAS_ID"),
                                      dr.GetDecimal("FAS_COD_PRATICA"),
                                      dr.GetString("FAS_COD_SERVIZIO"),
                                      dr.GetDecimal("FAS_NRO_FASE"));
           
            t.Gep_ana_fase.Afa_des_fase = dr.GetString("FAS_DES_FASE");
            t.Fas_Progr_Fase = dr.GetDecimal("FAS_PROGR_FASE");
            t.Fas_Unit_Oper = dr.GetString("FAS_UNIT_OPER");
            t.Fas_Dt_Arrivo = dr.GetDateTime("FAS_DT_ARRIVO");
            t.Gep_ana_statof.Id_stf_cod_stato = dr.GetString("FAS_STATO");
            t.Gep_ana_motstafase.Id_mfa_cod_motiv = dr.GetString("FAS_MOTIVAZ_FASE");
            t.Gep_ana_motstafase_chiusura.Id_mfa_cod_motiv = dr.GetString("FAS_MOTIVAZ_CHIUSURA");
            t.Fas_Dt_Inilav = dr.GetNullableDateTime("FAS_DT_INILAV");
            t.Fas_Dtora_App_Proasm = dr.GetNullableDateTime("FAS_DTORA_APP_PROASM");
            t.Fas_Dtora_App_Procli = dr.GetNullableDateTime("FAS_DTORA_APP_PROCLI");
            t.Fas_Dtora_App = dr.GetNullableDateTime("FAS_DTORA_APP");
            t.Fas_Dt_Atto_Rich = dr.GetNullableDateTime("FAS_DT_ATTO_RICH");
            t.Fas_Dt_Atto_Ott = dr.GetNullableDateTime("FAS_DT_ATTO_OTT");
            t.Fas_Dt_Inisosp = dr.GetNullableDateTime("FAS_DT_INISOSP");
            t.Fas_Dt_Finesosp = dr.GetNullableDateTime("FAS_DT_FINESOSP");
            t.Fas_Dt_Finelav = dr.GetNullableDateTime("FAS_DT_FINELAV");
            t.Fas_Imp_Addeb = dr.GetDecimal("FAS_IMP_ADDEB");
            t.Fas_Note = dr.GetString("FAS_NOTE");
            return t;
        }

        internal static ServizioEntity MapServizi(int nTipoLoad,IDataRecord dr)
        {
            ServizioEntity se = new ServizioEntity();
            if (nTipoLoad == 1)
            {
                se.POD = dr.GetString("pod");
                se.cod_fis = dr.GetString("codice_fiscale");
                se.par_iva = dr.GetString("partita_iva");
                se.Piva_Grossista = dr.GetString("piva_grossista");
            }
            if (nTipoLoad == 2)
            {
                se.ExistingPratica = true;
            }
            if (nTipoLoad == 3)
            {
                se.teS_ragsoc_ute= dr.GetString("tes_ragsoc_ute");
                se.TES_RAGSOC_CLI= dr.GetString("TES_RAGSOC_CLI");
                se.TES_IND_CLI= dr.GetString("TES_IND_CLI");
                se.TES_IND_FORNIT= dr.GetString("TES_IND_FORNIT");
                se.TES_COD_CONTR_CLI = dr["TES_COD_CONTR_CLI"].ToString();  // (dr["TES_COD_CONTR_CLI"] == DBNull.Value ? dr.GetString("TES_COD_CONTR_CLI") : ""); //dr.GetString("TES_COD_CONTR_CLI");dr.GetString("TES_COD_CONTR_CLI").ToString();  
                se.TES_MIS_ELECO= dr.GetString("TES_MIS_ELECO");
                se.TES_MATR_ATT = dr.GetString("TES_MATR_ATT");
                se.TES_MATR_rea= dr.GetString("TES_MATR_rea");
                se.TES_MATR_pot= dr.GetString("TES_MATR_pot");
                se.TES_TENSIONE= dr.GetString("TES_TENSIONE");
                se.TES_POTENZA_CONTR = Convert.ToDecimal(dr["TES_POTENZA_CONTR"].ToString());
                se.TES_POTENZA_TOLL = Convert.ToDecimal(dr["TES_POTENZA_TOLL"].ToString());
                se.TES_FASI= dr.GetString("TES_FASI");
                se.TES_USO= dr.GetString("TES_USO");
                se.TES_K = dr.GetString("TES_K");     
            }
            return se;
        }
    }
}
